Dando Inteligência ao Código — Decisões e Loops
Transforme scripts lineares em sistemas que tomam decisões, repetem tarefas automaticamente e respondem a cenários complexos.
Você vai aprender a
- ▹Configurar blocos
if/elif/elsepara controlar o fluxo. - ▹Automatizar tarefas com laços
forewhile. - ▹Usar
breakecontinuepara refinar algoritmos.
3.1 Introdução: Deixando o Código "Pensar"
Até aqui, nossos programas seguiram uma sequência rígida de instruções, executando tudo em linha reta. A verdadeira força da programação, porém, surge quando permitimos que o código reaja aos dados, tome decisões e repita ações automaticamente.
Neste capítulo, exploramos as duas estruturas que dão essa inteligência ao Python:
- Blocos de decisão (
if): escolhem caminhos diferentes com base em condições. - Laços de repetição (loops): repetem tarefas sem esforço manual.
Com elas, nossa “estrada reta” passa a ter desvios, cruzamentos e retornos controlados, permitindo construir soluções autônomas e robustas.
3.2 Estruturas de Decisão: Aprofundando no if
O bloco if/elif/else funciona como um guarda de trânsito, direcionando o fluxo conforme os dados. Para isso, ele depende de operadores de comparação que retornam valores booleanos (True ou False).
Operadores de Comparação
| Operador | Descrição | Exemplo (a = 5) | Resultado |
|---|---|---|---|
| == | É igual a? | a == 5 | True |
| != | É diferente de? | a != 3 | True |
| > | É maior que? | a > 4 | True |
| < | É menor que? | a < 5 | False |
| >= | É maior ou igual a? | a >= 5 | True |
| <= | É menor ou igual a? | a <= 4 | False |
3.2.1 Do if Simples ao if/elif/else
-
ifsimples: executa o bloco apenas quando a condição é verdadeira.# Exemplo: Classificação de Risco Geológico declividade = 35 # em graus # Apenas executa a ação se a declividade for considerada de risco if declividade > 30: print("Alerta: Risco alto de deslizamento devido à declividade acentuada.") -
if/else: oferece um caminho alternativo quando a condição inicial é falsa.# Exemplo: Verificação de balneabilidade de uma praia situacao_da_praia = "Regular" if situacao_da_praia == "Boa": print("Status: Praia liberada para banho.") else: print("Status: Praia com restrições. Verifique a qualidade da água.") -
if/elif/else: avalia múltiplas possibilidades sem repetir comparações.# Exemplo: Simbolização de um mapa de declividade declividade = 12 # em graus simbologia = "" # Inicializa a variável if declividade < 5: simbologia = "Verde (Plano)" elif declividade < 20: # Só é testado se o primeiro if for falso simbologia = "Amarelo (Suavemente Ondulado)" elif declividade < 45: # Só é testado se os anteriores forem falsos simbologia = "Laranja (Ondulado)" else: # Se nenhuma das condições acima for atendida simbologia = "Vermelho (Forte Ondulado/Montanhoso)" print(f"A simbologia para a declividade de {declividade}° é: {simbologia}")
3.2.2 Combinando Condições com Operadores Lógicos
Quando uma decisão depende de vários fatores, use and, or e not para construir filtros mais precisos.
andexige que todas as condições sejam verdadeiras.oraceita que uma condição verdadeira já satisfaça o teste.notinverte o resultado, útil para checar ausências.
altura_do_poste = 10.5
material = "Madeira"
necessita_reparo = False
# Exemplo com 'and': ambas as condições precisam ser verdadeiras
if altura_do_poste > 9.0 and material == "Madeira":
print("Alerta: Poste de madeira alto. Prioridade máxima para substituição!")
# Exemplo com 'or': basta uma condição verdadeira
if altura_do_poste > 10.0 or necessita_reparo:
print("Ação necessária: Enviar equipe de manutenção para inspeção.")
# Exemplo com 'not': executa quando a condição é falsa
if not necessita_reparo:
print("Status do poste: Operacional, nenhum reparo necessário no momento.")
3.2.3 ifs Aninhados: Uma Decisão Dentro da Outra
Estruturas aninhadas permitem criar funis de decisão, analisando primeiro um cenário geral e, em seguida, detalhes específicos.
# Exemplo: Análise de uso do solo em uma área de preservação
bioma = "Mata Atlântica"
nivel_regeneracao = "Avançado"
if bioma == "Mata Atlântica":
print("Analisando área dentro da Mata Atlântica.")
# Este 'if' aninhado só é verificado se o primeiro for verdadeiro
if nivel_regeneracao == "Avançado":
print("-> Ação: Área prioritária para conservação integral.")
elif nivel_regeneracao == "Inicial":
print("-> Ação: Área elegível para projetos de restauração.")
else:
print("-> Ação: Monitorar e avaliar.")
else:
print("Área fora do bioma de interesse para este projeto.")
3.2.4 if de Uma Linha (Operador Ternário)
Para atribuições simples, utilize a forma resumida valor_if if condição else valor_else, mantendo o código enxuto e legível.
temperatura = 28
altitude = 1200
# Atribui "Ensolarado" se a temperatura for maior que 25, senão "Ameno"
clima = "Ensolarado" if temperatura > 25 else "Ameno"
risco = "Alto" if altitude > 1000 else "Baixo"
print(f"O clima está: {clima}")
print(f"O risco de deslizamento é considerado: {risco}")
3.3 Estruturas de Repetição: Automatizando Tarefas com Loops
Loops poupam esforço repetitivo, permitindo processar milhares de arquivos, linhas ou feições com poucas linhas de código.
3.3.1 O Laço for: Percorrendo Sequências
O for é a ferramenta padrão para iterar sobre listas, tuplas, dicionários e outros iteráveis. Ele cuida do contador internamente, reduzindo erros e tornando o código mais claro.
For básico: percorrendo uma lista
# Lista com nomes de arquivos raster a serem processados
arquivos_raster = ["imagem_2022.tif", "imagem_2023.tif", "imagem_2024.tif"]
print("Iniciando o processamento de imagens...")
for nome_do_arquivo in arquivos_raster:
print(f"- Processando o arquivo: {nome_do_arquivo}")
# Aqui entraria o código para abrir, reclassificar ou salvar o raster
print("Processamento concluído.")
Repetindo um número fixo de vezes com range()
# Exemplo 1: Contagem regressiva
print("Contagem regressiva para lançamento do satélite:")
for i in range(5, 0, -1): # Começa em 5, termina em 1
print(i)
# Exemplo 2: Gerando múltiplos buffers
print("\nGerando buffers com diferentes distâncias:")
for distancia in range(50, 501, 50): # De 50 a 500, de 50 em 50 metros
print(f"- Criando buffer de {distancia} metros.")
Obtendo o índice e o valor com enumerate()
# Lista de vértices de um polígono
vertices = [(-48.5, -27.1), (-48.4, -27.1), (-48.4, -27.0)]
for indice, coordenada in enumerate(vertices):
print(f"Vértice {indice}: Coordenadas {coordenada}")
Percorrendo dicionários com .items()
# Dicionário com metadados de uma imagem de satélite
metadados = {
"satelite": "Landsat 9",
"data_captura": "2024-10-26",
"resolucao_m": 30
}
print("Metadados da Imagem:")
for chave, valor in metadados.items():
print(f"- {chave.replace('_', ' ').capitalize()}: {valor}")
3.3.2 O Laço while: Enquanto a condição for verdadeira
Use while quando não souber quantas repetições serão necessárias, mas conhecer a condição de permanência. Lembre-se de atualizar essa condição dentro do loop para evitar laços infinitos.
Validação de entrada de dados
# Exemplo: Validando a entrada de uma altitude positiva
while True: # Inicia um loop aparentemente infinito
entrada = input("Digite uma altitude (em metros): ")
try:
altitude = float(entrada)
if altitude > 0:
break # Sai do loop se a verificação der certo
else:
print("Erro: A altitude deve ser um número positivo.")
except ValueError:
print("Erro: Entrada inválida. Por favor, digite um número.")
print(f"Altitude válida inserida: {altitude}m")
Simulação operacional
# Exemplo: Simulação de bateria de um drone em campo
bateria_restante = 100
uso_por_hora = 15
horas_de_voo = 0
print("Iniciando operação do drone...")
while bateria_restante > 20: # Condição de parada
print(f"Hora {horas_de_voo}: Bateria em {bateria_restante}%. Operando normalmente.")
bateria_restante -= uso_por_hora # Atualiza a condição!
horas_de_voo += 1
print(f"Fim da operação na hora {horas_de_voo}. Bateria em {bateria_restante}%. Nível crítico. Retornando para a base.")
3.3.3 Controlando o Fluxo dos Loops: break e continue
Essas palavras-chave permitem interromper um loop ou pular a iteração atual, dando mais controle sobre a execução.
break: Saída de emergência
# Procurando pelo primeiro setor censitário com população acima de 1000
setores = [
{"id": "A", "pop": 750},
{"id": "B", "pop": 1200},
{"id": "C", "pop": 900},
]
for setor in setores:
print(f"Analisando setor {setor['id']}...")
if setor['pop'] > 1000:
print(f"Encontrado! O setor {setor['id']} tem população de {setor['pop']}.")
break # Para o loop assim que o primeiro for encontrado
continue: Pulando para o próximo item
# Processando uma lista de arquivos, mas ignorando os que não são shapefiles
arquivos = ["dados.shp", "relatorio.txt", "mapa.shp", "backup.zip"]
for arquivo in arquivos:
if not arquivo.endswith(".shp"):
continue # Pula para o próximo arquivo
# Este código só será executado para os arquivos .shp
print(f"Processando o shapefile: {arquivo}")
3.4 Conclusão
Com estruturas de decisão e repetição, seu código ganha autonomia: analisa cenários, reage a dados e executa rotinas extensas com poucos comandos. Esses recursos são a base para criar pipelines inteligentes de análise espacial, processamento de imagens e integração com APIs.
No próximo capítulo, combinaremos coleções, decisões e loops com funções para modularizar scripts e construir ferramentas reutilizáveis.